  package pe.edu.upc.dsd.qwerty.wsreserva.service.impl;

import java.util.List;
import java.util.UUID;

import javax.jws.WebService;

import org.springframework.beans.factory.annotation.Autowired;

import pe.edu.upc.dsd.qwerty.wsreserva.dao.PasajeroDAO;
import pe.edu.upc.dsd.qwerty.wsreserva.dao.VuelosDAO;
import pe.edu.upc.dsd.qwerty.wsreserva.model.Asiento;
import pe.edu.upc.dsd.qwerty.wsreserva.model.Pasajero;
import pe.edu.upc.dsd.qwerty.wsreserva.model.Vuelo;
import pe.edu.upc.dsd.qwerty.wsreserva.service.VueloService;
import pe.edu.upc.dsd.qwerty.wsreserva.util.bean.BeanRespuesta;
import pe.edu.upc.dsd.qwerty.wsreserva.util.bean.BeanRespuestaPasajero;
import pe.edu.upc.dsd.qwerty.wsreserva.util.bean.MailService;

@WebService(endpointInterface = "pe.edu.upc.dsd.qwerty.wsreserva.service.VueloService")
public class VueloServiceImpl implements VueloService {

	public static Integer ASIENTO_LIBRE = 0;
	public static Integer ASIENTO_PRE_RESERVADO = 1;
	public static Integer ASIENTO_RESERVADO = 2;
	public static Integer ASIENTO_PRE_COMPRADO = 3;
	public static Integer ASIENTO_COMPRADO  = 4;
	
	@Autowired
	private VuelosDAO vuelosDAO;
	
	@Autowired
	private PasajeroDAO pasajeroDAO;

	@Autowired
	private MailService mailService;
	
	@Override
	public List<Vuelo> obtenerListaVuelos() {
		return vuelosDAO.listarVuelos();
	}

	@Override
	public List<Asiento> obtenerAsientos(String idVuelo) {
		return vuelosDAO.obtenerAsientos(idVuelo);
	}

	@Override
	public Vuelo obtenerVuelo(String idVuelo) {
		return vuelosDAO.obtenerVuelo(idVuelo);
	}

	@Override
	public Asiento obtenerAsiento( Integer idAsiento) {
		return vuelosDAO.obtenerAsiento(idAsiento);
	}

	@Override
	public BeanRespuesta reservarAsiento(String pasajero, String password, Integer idAsiento) {
		BeanRespuesta rep = new BeanRespuesta(0,"Asiento reservado");
		try {
			rep = validarUsuario(pasajero, password);
			if( rep.getCodigo().intValue() == 0 ){
				Pasajero pas = pasajeroDAO.autenticarPasajero(pasajero, password);
				
				vuelosDAO.reservarAsiento(idAsiento, ASIENTO_PRE_RESERVADO , pas.getIdpasajero() , UUID.randomUUID().toString() );
				
				Asiento asiento = vuelosDAO.obtenerAsiento( idAsiento ) ;
				mailService.enviaMensaje(pas.getCorreo(), asiento  ,  vuelosDAO.obtenerVuelo(asiento.getIdVuelo().toString() ) );
				rep.setError(0,"La reserva se ha registrado, estamos a la espera de su confirmacion");
			}
		} catch (Exception e) {
			e.printStackTrace();
			rep.setError(2,"Error " + e.getMessage());
		}		
		return rep;
	}

	@Override
	public BeanRespuesta comprarAsiento(String usuario, String password, Integer idAsiento) {
		BeanRespuesta rep = new BeanRespuesta(0,"La compra se ha realizado exitosamente");
		Pasajero pas = new Pasajero();
		vuelosDAO.reservarAsiento(idAsiento, ASIENTO_PRE_COMPRADO, pas.getIdpasajero() , UUID.randomUUID().toString() );
		return rep;
	}

	@Override
	public BeanRespuesta liberarAsiento(Integer idAsiento) {
		BeanRespuesta rep = new BeanRespuesta(0,"Asiento liberado");
		vuelosDAO.procesarAsiento(idAsiento, ASIENTO_LIBRE);
		return rep;
	}

	@Override
	public BeanRespuestaPasajero registrarPasajero(Pasajero pasajero) {
		BeanRespuestaPasajero rep = new BeanRespuestaPasajero(0,"Se ha registrado al pasajero correctamente");
		try {
			vuelosDAO.registraPasajero(pasajero);
			rep.setPasajero( pasajeroDAO.obtenerPasajero( pasajero.getUsuario() ) );
		} catch (Exception e) {
			rep.setError(1, "Error : "+e.getMessage());
			rep.setPasajero(new Pasajero());
		}
		return rep;
	}

	@Override
	public BeanRespuesta validarUsuario(String usuario, String password) {
		BeanRespuesta rep = new BeanRespuesta(0,"Validacion correcta");
		try {
			Pasajero pa = pasajeroDAO.autenticarPasajero(usuario, password);
			if(pa == null ){ 
				rep.setError(1, "Usuario no encontrado");
			}else{
				if( !pa.getPassword().equals(password) ){rep.setError(2, "Password Incorrecto");
				}else{ rep.setUsername( pa.getNombre() + " " + pa.getApepaterno() + " " + pa.getApematerno()  ); }
			}
		} catch (Exception e) {
			rep.setError(3, "Error : "+e.getMessage());			
		}
		return rep;
	}

	@Override
	public BeanRespuestaPasajero obtenerPasajero(Integer idPasjaero) {
		BeanRespuestaPasajero rep = new BeanRespuestaPasajero(0,"Pasajero encontrado");
		try {
			rep.setPasajero( pasajeroDAO.obtenerPasajero( idPasjaero ) );
		} catch (IndexOutOfBoundsException e) {
			rep.setError(1, "Error : No se encontro al pasajero ");
			rep.setPasajero(new Pasajero());
		} catch (Exception e) {
			rep.setError(2, "Error : "+e.getMessage());
			rep.setPasajero(new Pasajero());
		}
		return rep;
	}
	
	

}
